package com.example.springmongo.po;

import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

/**
 * @author lzh
 * @date 2019/9/17 - 9:20
 *
 * @Document(collection = "user")
 * 表明这是一个文档对象，名称为user，对应Mongo DB里的user表。
 * @Id标注主键字段，String类型的主键值在插入的时候MongoDB会帮我们自动生成。
 * 如果对象中的某个属性为非表字段，可以使用注解@Transient进行排除
 */
@Document(collection = "user")

public class User {

    //若使用objectId为主键类型，则数据库生成的数据如下
    //{
    //    "id": {
    //        "timestamp": 1568685753,
    //        "machineIdentifier": 5567323,
    //        "processIdentifier": 12836,
    //        "counter": 11993655,
    //        "date": "2019-09-17T02:02:33.000+0000",
    //        "time": 1568685753000,
    //        "timeSecond": 1568685753
    //    },
    //    "name": "qewr1rewgs",
    //    "age": 16,
    //    "description": "wqrqr1vq"
    //}



    @Id
    private String id;

    private String  name;

    private Integer age;

    private String description;


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", description='" + description + '\'' +
                '}';
    }

    /**
     * @Id：用于标记id字段，没有标记此字段的实体也会自动生成id字段，但是我们无法通过实体来获取id。id建议使用ObjectId类型来创建。
     *
     * @Document：用于标记此实体类是mongodb集合映射类。可以使用collection参数指定集合名称。特别需要注意的是如果实体类没有为任何字段创建索引将不会自动创建集合。
     *
     * @Indexed：用于标记为某一字段创建索引。direction参数可以指定排序方向，升或降序。
     *
     * @CompoundIndex：用于创建复合索引。def参数可以定义复合索引的字段及排序方向。
     *
     * @Transient：被该注解标注的，将不会被录入到数据库中。只作为普通的javaBean属性。
     *
     * @PersistenceConstructor：用于声明构造函数，作用是把从数据库取出的数据实例化为对象。
     *
     * @Field：用于指定某一个字段映射到数据库中的名称。
     *
     * @DBRef：用于指定与其他集合的级联关系，但是需要注意的是并不会自动创建级联集合
     */





    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}
